home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software Vault: The Sapphire Collection
/
Software Vault (Sapphire Collection) (Digital Impact).ISO
/
cdr47
/
pgloader.zip
/
ADLIB.ASM
< prev
next >
Wrap
Assembly Source File
|
1994-05-28
|
5KB
|
171 lines
;--------------------------------------------------------------------
; SimplexAdlib Player
;--------------------------------------------------------------------
; Copyright (C) 1993 Future Crew
;--------------------------------------------------------------------
; code: Psi
; music: Skaven
;--------------------------------------------------------------------;
; Modifications for PGRID Loader by Friar Tuck, outlined by comment ;
; blocks ;
;--------------------------------------------------------------------;
;████████████████ Simplex Adlib Player ████████████████
;this doesn't just read raw data to output to adlib like the one
;used in the last starport intro. This player really does have
;note & instrument data it reads and processes!
;adlib data
a_musiccnt dw 0
a_chdelaycnt db 9 dup(0)
a_chdelay db 9 dup(0)
;adlib player data
a_inst_table LABEL BYTE
db 20h+0,20h+1,20h+2,20h+8,20h+9,20h+10,20h+16,20h+17,20h+18
NTB equ 8192 ;+1024*1
a_note_table LABEL WORD
dw NTB+363,NTB+385,NTB+408,NTB+432,NTB+458,NTB+485
dw NTB+514,NTB+544,NTB+577,NTB+611,NTB+647,NTB+868
;note: a zero word is expected after this table (found in col0)
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ output data to adlib ▒▒▒▒▒▒▒▒▒▒▒▒▒▒
a_lodsboutaw03: ;size optimization related entry (instrument loading)
call a_lodsboutaw
add ah,3
a_lodsboutaw: ;size optimization related entry (instrument loading)
lodsb
a_outaw PROC ;ah=reg,al=data
push ax
push cx
xchg al,ah
mov dx,388h
out dx,al
mov cx,7
call a_wait
mov dx,389h
mov al,ah
out dx,al
mov cx,30
call a_wait
pop cx
pop ax
ret
a_wait: in al,dx
loop a_wait
ret
a_outaw ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ load instrument to adlib ▒▒▒▒▒▒▒▒▒▒▒▒▒▒
a_loadinstrument PROC
;bx=channel, ds:si=offset to instrument data
mov ah,ds:a_inst_table[bx]
mov cx,4
@@11: call a_lodsboutaw03
add ah,20h-3
loop @@11
add ah,40h
call a_lodsboutaw03
mov ah,bl
add ah,0c0h
jmp a_lodsboutaw
a_loadinstrument ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ set note on/off ▒▒▒▒▒▒▒▒▒▒▒▒▒▒
a_playnote PROC
;bx=channel, ax=data
push bx
xchg ah,bl
add ah,0a0h
call a_outaw
mov al,bl
add ah,010h
pop bx
jmp a_outaw
a_playnote ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ initialize/clear/shutup adlib ▒▒▒▒▒▒▒▒▒▒▒▒▒▒
a_init PROC
mov ax,00120h
call a_outaw
mov ax,00800h
call a_outaw
mov ah,0bdh
call a_outaw
mov bp,9
xor bx,bx
mov di,OFFSET music_instruments
@@12: mov si,ds:[di]
add di,2
call a_loadinstrument
xor ax,ax
call a_playnote
inc bx
dec bp
jnz @@12
ret
a_init ENDP
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ advance music one row ▒▒▒▒▒▒▒▒▒▒▒▒▒▒
a_dorow PROC
;-------------------------------;
mov cx,24 ;
mov di,offset pal+222 ;
ad_01: mov al,byte ptr cs:[di] ;
sub al,2 ;
js ad_02 ;
mov byte ptr cs:[di],al ;
ad_02: inc di ;
loop ad_01 ;
;-------------------------------;
@@c: sub ds:a_musiccnt,1
jnc @@0
mov ds:a_musiccnt,music_speed
mov cx,music_channels
mov di,OFFSET music_patterns
xor bx,bx
@@13: sub ds:a_chdelaycnt[bx],1
jns @@2
mov si,ds:[di]
xor ax,ax
call a_playnote
;-------------------------------;
push bx ;
push ax ;
mov ax,bx ;
sal ax,1 ;
add bx,ax ;
add bx,222 ;
mov byte ptr cs:pal[bx],30 ;
mov byte ptr cs:pal[bx+1],30;
mov byte ptr cs:pal[bx+2],62;
pop ax ;
pop bx ;
;-------------------------------;
@@4: lodsb
or al,al
jz @@7
jns @@6
sub al,81h
mov ds:a_chdelay[bx],al
lodsb
@@6: mov dl,al
and ax,15
mov bp,ax
add bp,bp
mov ax,ds:a_note_table[bp]
shr dl,2
and dl,not 3
add ah,dl
call a_playnote
mov al,ds:a_chdelay[bx]
mov ds:a_chdelaycnt[bx],al
mov ds:[di],si
@@2: add di,4
inc bx
loop @@13
@@0: ret
@@7: mov si,ds:[di+2]
jmp @@4
a_dorow ENDP